package com.ayz.gateway.center.infrastructure.nginx;

import com.ayz.gateway.center.infrastructure.notify.GatewayServiceChangeEvent;
import com.github.odiszapc.nginxparser.NgxConfig;

import java.io.File;
import java.io.IOException;

/**
 * @ClassName GatewayServiceDeployer
 * @Description TODO: 网关服务部署的功能接口
 * 部署的本质就是修改Nginx的配置文件
 * @Author 快乐的星球
 * @Date 2023/6/12 12:18
 * @Version 1.0
 **/

public interface GatewayServiceDeployer {
    /**
     * Ngx配置文件的基础元数据信息
     * @return
     */
    public NgxConfigMetadata getNgxConfigMetadata();

    /**
     * 获取Ngx配置文件 读取出来的对象
     * @return
     */
    public NgxConfig getNgxConfig();

    /**
     * 装载nginx配置文件 生成 NgxConfig对象
     * @param ngxConfig
     * @return
     * @throws IOException
     */
    public NgxConfig loadNgxConfig(File ngxConfig) throws IOException;

    /**
     * 部署网关服务
     * 网关服务上线部署 and 网关服务下线部署
     * @param gatewayServiceMetadata 网关服务变更的元数据信息
     * @throws Exception
     */
    public void deploy(GatewayServiceChangeEvent.GatewayServiceMetadata gatewayServiceMetadata)
        throws Exception;

    /**
     * 调用Docker Daemon 让NGX容器执行配置文件重新加载
     * @throws Exception
     */
    public void refreshNgxConfig() throws Exception;

    /**
     * Ngx负载均衡配置
     * @return
     */
    public LoadBalanceRule getLoadBalanceRule();

    /**
     * 初始化
     * @throws IOException
     */
    public void init() throws IOException;


}
